package com.fragrance.service;

import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSONObject;
import com.aliyuncs.iot.model.v20170420.BatchGetDeviceStateResponse.DeviceStatus;
import com.aliyuncs.iot.model.v20170420.CreateProductResponse.ProductInfo;
import com.aliyuncs.iot.model.v20170420.QueryDeviceByNameResponse.DeviceInfo;
import com.aliyuncs.iot.model.v20170420.QueryDeviceResponse;
import com.aliyuncs.iot.model.v20170420.QueryPageByApplyIdResponse.ApplyDeviceInfo;
import com.aliyuncs.iot.model.v20170420.RegistDeviceResponse;

public interface IotApiService {

	/**
	 * 创建产品
	 *
	 * @param productName
	 *            产品名称
	 * @param productDesc
	 *            产品描述 可空
	 * @return 产品的PK
	 */
	ProductInfo createProduct(String productName, String productDesc);

	/**
	 * 修改产品
	 *
	 * @param productKey
	 *            产品PK 必需
	 * @param productName
	 *            产品名称 非必需
	 * @param productDesc
	 *            产品描述 非必需
	 */
	Boolean updateProduct(String productKey, String productName, String productDesc);

	/**
	 * 注册设备
	 *
	 * @param productKey
	 *            产品pk
	 * @param deviceName
	 *            设备名称 非必须
	 * @return 设备名称
	 */
	RegistDeviceResponse registDevice(String productKey, String deviceName);

	/**
	 * 查询设备列表
	 *
	 * @param productKey
	 *            产品PK
	 * @param pageSize
	 *            每页显示条数 非必须
	 * @param currentPage
	 *            当前页 非必须
	 */
	QueryDeviceResponse queryDevice(String productKey, Integer pageSize, Integer currentPage);

	/**
	 * 根据名称查询设备
	 * 
	 * @param productKey
	 * @param deviceName
	 */
	DeviceInfo queryDeviceByName(String productKey, String deviceName);

	/**
	 * 批量查询设备状态
	 *
	 * @param productKey
	 *            产品pk
	 * @param deviceNames
	 *            设备名称集合
	 */
	List<DeviceStatus> batchGetDeviceStatus(String productKey, List<String> deviceNames);

	/**
	 * 批量申请设备
	 *
	 * @param productKey
	 *            产品pk
	 * @return 申请单id
	 */
	Long applyDeviceWithNames(String productKey, List<String> deviceNames);

	/**
	 * 查询申请单是否执行完毕
	 *
	 * @param applyId
	 *            申请单id
	 * @return 是否执行完毕
	 */
	Boolean queryApplyStatus(Long applyId);

	/**
	 * 分页查询批量申请的设备
	 *
	 * @param applyId
	 *            申请单id
	 * @param pageSize
	 *            每页显示条数
	 * @param currentPage
	 *            当前页
	 */
	List<ApplyDeviceInfo> queryPageByApplyId(Long applyId, Integer pageSize, Integer currentPage);

	/**
	 * pub消息
	 *
	 * @param productKey
	 *            pk
	 * @param topic
	 *            topic
	 * @param msg
	 *            消息内容
	 */
	String publishMssage(String productKey, String topic, String msg);

	/**
	 * 发送广播消息
	 *
	 * @param productKey
	 *            产品pk
	 * @param topic
	 *            广播topic /broadcast/${pk}/+
	 * @param msg
	 *            消息内容
	 */
	Boolean publishBroadcast(String productKey, String topic, String msg);

	/**
	 * 发送rrpc消息
	 *
	 * @param productKey
	 *            产品pk
	 * @param deviceName
	 *            设备名称
	 * @param msg
	 *            消息内容
	 */
	public Boolean sendRrpcMsg(String productKey, String deviceName, String msg);

	/**
	 * 获取设备影子信息
	 *
	 * @param productKey
	 *            产品pk
	 * @param deviceName
	 *            设备名称
	 * @return 影子信息
	 */
	JSONObject getDeviceShadow(String productKey, String deviceName);

	/**
	 * 更新影子信息
	 *
	 * @param productKey
	 *            产品pk
	 * @param deviceName
	 *            设备名称
	 * @param shadowVersion
	 * @param attributeMap
	 *            属性
	 */
	Boolean updateDeviceShadow(String productKey, String deviceName, Long shadowVersion,
			LinkedHashMap<String, Object> attributeMap);

	Boolean saveDeviceProp(String productKey, String deviceName, Map<String, Object> props);

	Boolean deleteDeviceProp(String productKey, String deviceName);

	Boolean queryDeviceProp(String productKey, String deviceName);

}
